#!/bin/bash

# 定义颜色输出
GREEN='\033[0;32m'
RED='\033[0;31m'
NC='\033[0m' # No Color

# 函数：测试 RFID 读取器
test_rfid() {
  echo -e "${GREEN}开始测试 RFID 读取器...${NC}"
  local device="/dev/ttyS1"

  # 检查串口设备是否存在
  if [ ! -e "$device" ]; then
    echo -e "${RED}错误：找不到串口设备 $device${NC}"
    return 1
  fi

  # 打开串口连接
  exec 3<>$device

  # 配置串口参数
  stty -F $device 115200 cs8 -cstopb -parenb

  # 发送测试命令到 RFID 模块
  echo -e "\x5A\x00\x01\x01\x01\x00\x00\xEB\xD5" >&3

  # 等待响应
  echo "等待 RFID 模块响应..."
  read -t 5 -N 9 response <&3
  local read_status=$?

  # 关闭串口连接
  exec 3>&-

  # 检查响应
  if [ $read_status -eq 0 ] && [ ! -z "$response" ]; then
    echo -e "${GREEN}收到 RFID 模块响应${NC}"

    # 将响应转换为十六进制显示
    hex_response=$(xxd -p <<<"$response")
    echo "十六进制响应数据: $hex_response"

    # 检查响应格式是否正确(以5a0101开头且长度为20)
    if [[ $hex_response =~ ^5a0101 ]] && [ ${#hex_response} -eq 20 ]; then
      echo -e "${GREEN}收到有效的 RFID 响应数据${NC}"
      local test_result=0
    else
      echo -e "${RED}收到无效的 RFID 响应数据${NC}"
      local test_result=1
    fi
  else
    echo -e "${RED}未收到 RFID 模块响应或响应超时${NC}"
    local test_result=1
  fi

  # 显示最终测试结果
  echo -e "\n${GREEN}=== 测试完成 ===${NC}"

  if [ $test_result -eq 0 ]; then
    echo -e "${GREEN}RFID 模块工作正常！${NC}"
    return 0
  else
    echo -e "${RED}RFID 模块工作异常！${NC}"
    return 1
  fi
}

# 函数：测试屏幕
test_screen() {
  echo -e "${GREEN}开始测试屏幕...${NC}"
  local device="/dev/ttyS2"

  # 检查串口设备是否存在
  if [ ! -e "$device" ]; then
    echo -e "${RED}错误：找不到串口设备 $device${NC}"
    return 1
  fi

  # 打开串口连接
  exec 3<>$device

  # 配置串口参数
  stty -F $device 115200 cs8 -cstopb -parenb

  # 发送测试命令到屏幕模块
  echo -e "\xA5\x5A\x03\x81\x00\x01" >&3

  # 等待响应
  echo "等待屏幕模块响应..."
  read -t 5 -N 6 response <&3
  local read_status=$?

  # 关闭串口连接
  exec 3>&-

  # 检查响应
  if [ $read_status -eq 0 ] && [ ! -z "$response" ]; then
    echo -e "${GREEN}收到屏幕模块响应${NC}"

    # 将响应转换为十六进制显示
    hex_response=$(xxd -p <<<"$response")
    echo "十六进制响应数据: $hex_response"

    # 检查响应格式是否正确(以a55a开头且长度为14)
    if [[ $hex_response =~ ^a55a ]] && [ ${#hex_response} -eq 14 ]; then
      echo -e "${GREEN}收到有效的屏幕响应数据${NC}"
      local test_result=0
    else
      echo -e "${RED}收到无效的屏幕响应数据${NC}"
      local test_result=1
    fi
  else
    echo -e "${RED}未收到屏幕模块响应或响应超时${NC}"
    local test_result=1
  fi

  # 显示最终测试结果
  echo -e "\n${GREEN}=== 测试完成 ===${NC}"

  if [ $test_result -eq 0 ]; then
    echo -e "${GREEN}屏幕模块工作正常！${NC}"
    return 0
  else
    echo -e "${RED}屏幕模块工作异常！${NC}"
    return 1
  fi
}

# 函数：测试锁控
test_lock() {
  echo -e "${GREEN}开始测试锁控...${NC}"
  local test_count=3
  local success_count=0

  for ((i = 1; i <= $test_count; i++)); do
    echo -e "\n${GREEN}=== 第 $i 次测试 ===${NC}"

    # 读取初始状态并显示对应状态描述
    initial_state=$(gpio read 20)
    if [ $initial_state -eq 1 ]; then
      echo "当前锁控处于打开状态"
    else
      echo "当前锁控处于关闭状态"
    fi

    # 提示用户操作
    if [ $initial_state -eq 1 ]; then
      echo -e "${GREEN}请关闭锁控，然后按回车键继续...${NC}"
    else
      echo -e "${GREEN}请打开锁控，然后按回车键继续...${NC}"
    fi
    read

    # 读取操作后状态并显示对应状态描述
    new_state=$(gpio read 20)
    if [ $new_state -eq 1 ]; then
      echo "操作后锁控处于打开状态"
    else
      echo "操作后锁控处于关闭状态"
    fi

    # 检查状态是否改变
    if [ $initial_state -ne $new_state ]; then
      echo -e "${GREEN}本次锁控测试成功！${NC}"
      ((success_count++))
    else
      echo -e "${RED}本次锁控测试失败！${NC}"
    fi
  done

  # 显示最终测试结果
  echo -e "\n${GREEN}=== 测试完成 ===${NC}"
  echo "总测试次数: $test_count"
  echo "成功次数: $success_count"

  if [ $success_count -eq $test_count ]; then
    echo -e "${GREEN}所有测试全部通过，锁控模块工作正常！${NC}"
  else
    echo -e "${RED}测试未完全通过，成功率: $success_count/$test_count${NC}"
  fi
}

# 主菜单
while true; do
  echo -e "\n${GREEN}=== 硬件测试工具 ===${NC}"
  echo "请选择测试的模块："
  echo "1. RFID 读取器"
  echo "2. 屏幕"
  echo "3. 锁控"
  echo "4. 退出程序"

  read -p "请输入选项编号 (1-4): " choice

  case $choice in
  1)
    test_rfid
    ;;
  2)
    test_screen
    ;;
  3)
    test_lock
    ;;
  4)
    echo -e "${GREEN}程序已退出${NC}"
    exit 0
    ;;
  *)
    echo -e "${RED}错误：无效的选项，请重新选择${NC}"
    ;;
  esac

  echo -e "\n按回车键继续..."
  read
done
